L1-030 一帮一

题目 L1-030 一帮一

image-9a1d38ad

思路分析

代码实现

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

#define int long long

using ll = long long;

using ull= unsigned long long;

using PII = pair<int,int>;

using Pll = pair<ll,ll>;

int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};

const int inf = 0x3f3f3f3f;

const int N = 55;

using PIS = pair<int,string>;

PIS student[N];

bool is_match[N];

//const int N=55;

//vector<string> male;

//vector<string> female;

signed main()

{

	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

	int n;cin>>n;

	for(int i=0;i<n;i++){

		int sex;string name;

		cin>>sex>>name;

		student[i].first=sex,student[i].second=name;

	}

//	for(int i=0;i<n;i++)	cout<<student[i].first<<" "<<student[i].second<<endl;

	// 貌似不能用对撞指针 因为名次高低与性别无关 很可能出现右边全是同一性别 j指针不好控制移动(单调性不满足)

//	for(int i=0,j=n-1;i<n;i++){

//		while(j>=0 && student[i].first != student[i].first)	j--;

//		if(student[i].first != student[i].first){

//

//		}

//	}

	//考虑换个思路 因为一定是男女匹配 且保证男女比例为1:1 那么就一定每人都能匹配到

	//干脆 男女分别排序 然后一一成对输出

	//也不对 这样的话控制不了名次从高到底排列

//	int n;cin>>n;

//	while(n--){

//		int sex;string name;cin>>sex>>name;

//		if(sex==0)	female.push_back(name);

//		else male.push_back(name);

//	}

//

//	reverse(male.begin(),male.end());

//

//	for(int i=0;i<male.size()-1;i++){

//		cout<<female[i]<<" "<<male[i]<<endl;

//	}

	//暴力吧 还是双指针思路 用一个标记记录某人是否已经组过队 对每个人遍历去找

	for(int i=0;i<n;i++){

		for(int j=n-1;j>=0;j--){

			if(!is_match[i] && !is_match[j]){

				if(student[i].first != student[j].first){

					cout<<student[i].second<<" "<<student[j].second<<endl;

					is_match[i]=true;is_match[j]=true;

					break;

				}

			}

		}

	}

	return 0;

 }

同类题型

视频讲解


⬅️ L1-029 是不是太胖了 🏠 00-天梯赛 ➡️ L1-031 到底是不是太胖了